<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深拷贝</title>
    
</head>

<body>



    <script>
        // 深拷贝：把对象的多层的属性或方法拷贝给一个新的对象  层层拷贝
        // 1. 通过 JSON 序列化实现
        // 2. lodash库 实现
        // 3. 通过递归实现

        // 深拷贝实现方式三：递归函数实现
        const obj = {
            name: '佩奇',
            family: {
                father: '猪爸爸',
                mother: {
                    name: "猪妈妈"
                }
            },
            hobby: ['跳泥坑', '唱歌']
        }

        // 封装一个深拷贝cloneDeep函数-递归函数实现
        function cloneDeep(oldObj) {
            // 判断传进来的实参是对象还是数组
            const  newObj = Array.isArray(oldObj) ? [] : {};
            console.log(newObj);
            // 遍历拷贝属性和值
            for (const k in oldObj) {
                // k是属性   oldObj[k]是值
                // 把旧对象的值给新对象的属性
                if (typeof oldObj[k] === "object") {
                    //如果属性对应的值还是对象 则递归
                    newObj[k] =cloneDeep(oldObj[k]) 
                } else {
                    // 属性是基本类型 直接赋值
                    newObj[k] = oldObj[k]
                }

            }

            return newObj

        }



    
        let obj2 = cloneDeep(obj)

        obj2.family.wife.name = "mary"
        console.log(obj);
        console.log(obj2);
        




    </script>
</body>

</html>